package generics;

import org.junit.Test;

public class GenericsTest {
    /**
     * 泛型类
     */
    @Test
    public void test1(){
        Person1<String> person=new Person1<>();
        person.setAge("20");
        System.out.println(person.getAge());
    }

    /**
     * 泛型方法1
     */
    @Test
    public void test2(){
        //当调用泛型方法时，可以把具体类包围在<> 中，放在方法名前面
        Person2 person2=new Person2();
        String str1=person2.<String>getObject1("zhangsan");
        System.out.println(str1);
        //实际上泛型方法可以省略类型参数，编译器会自动推断，上面的写法可以简写成下面的
        String str2=person2.getObject1("lisi");
        System.out.println(str2);
    }

    /**
     * 泛型方法2
     */
    @Test
    public void test3(){
        //当有多个泛型方法时，并且省略泛型的具体类型，让编译器推导时，
        // 编译器会推导，两个参数的共同父类参数
        Person2.getObject2(2.2,0,null);
    }

    /**
     * 对泛型类型的限定,子类型统一用extends ,不论父类型是类还是借口。
     * 也可以一次限定多个子类型 如 T extends Comparable & Serializable
     */
    @Test
    public void test4(){
        Integer [] a ={2,3,4};
        Integer b=Person2.getSmall(a);
        System.out.println(b);
    }
}
